package com.example.validatestudy.demos.dataStructures;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;

/**
 * @param
 * @version v1
 * @auther WANGZHENFANG004
 * @summary
 * @since 2024 06 24 14 18
 */
public class QueueTest {

    public static void main(String[] args) {

        /**
         * 方法太多不好记？队列主要是入队出队、首个元素、空判断，这四个方法。
         * 入队
         * add 增加一个元索 如果队列已满，则抛出一个IIIegaISlabEepeplian异常
         * offer 添加一个元素并返回true 如果队列已满，则返回false
         * 出队
         * remove 移除并返回队列头部的元素 如果队列为空，则抛出NoSuchElementException异常
         * poll 移除并返问队列头部的元素 如果队列为空，则返回null
         * 首个元素
         * element 返回队列头部的元素 如果队列为空，则抛出NoSuchElementException异常
         * peek 返回队列头部的元素 如果队列为空，则返回null
         * 空判断
         * isEmpty() 空判断，List接口的方法
         * BlockingQueue特有方法
         * put 添加一个元素 如果队列满，则阻塞
         * take 移除并返回队列头部的元素 如果队列为空，则阻塞
         * 值得注意的是LinkedList类实现了Queue接口，因此我们可以把LinkedList当成Queue来用。
         */
        Queue<Integer> queue = new LinkedList<>();
        //链表/队列末位添加元素
        boolean b1 = queue.add(1);
        //LinkedList中和add()方法一样
        boolean b2 = queue.offer(2);
        //返回头部元素，并删除元素, 队列为空则报异常
        Integer i1 = queue.remove();
        //返回头部元素，并删除元素，队列为空则返回null
        Integer i2 = queue.poll();
        //返回头部元素，不删除
        Integer i3 = queue.peek();
        //队列中是否存在
        boolean b3 = queue.contains(1);
        //队列是否为空
        boolean b4 = queue.isEmpty();
        //使用自定义栈
        stackTest();
    }

    /**
     * 使用自定义栈
     */
    public static void stackTest(){
        MyStack stack = new MyStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.peek());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.peek());
        //预计结果 1 1 2 3
    }

    /**
     * 自定义栈
     * 用到Queue的peek()\poll()\add()
     */
    private static class MyStack{

        Queue<Integer> queue;

        public  MyStack(){
            queue = new LinkedList();
        }

        public Integer peek(){
            return queue.peek();
        }

        public Integer pop(){
            return queue.poll();
        }

        public boolean push(Integer e){
            queue.add(e);
            int size = queue.size();
            while (size-- >0){
                queue.add(queue.poll());
            }
            return true;
        }

    }

}
